在上一篇章節介紹過 Blob 物件與 Tree 物件後,接下來讓我們認識 Commit 與 Tag 分別是什麼吧!
在我們使用 git add 指令加至暫存區時,會產生一個 Blob 物件,紀錄檔案的內容;而在執行 git commit 指令時,會發現除了新增 Tree 型態的物件來儲存檔名之類的東西,同時又有其他 SHA-1 雜湊值出現,讓我們來看看這型態是什麼吧!
首先,我 git commit 了一個新的版本,可以看到 objects 目錄內新增了兩筆檔案。
$ git commit -m"紀錄訊息“
objects
目錄內新增了兩筆檔案
讓我們分別用指令查查看這兩個檔案的「型態」分別是什麼。
$ git cat-file -t [SHA-1 雜湊值(40字元)] #查看檔案型態
-t
參數為用來查看檔案的型態,-p
參數則是查看檔案的內容。
訊息提示發現有 Tree 物件與 Commit ,由於在前面章節有介紹過 Tree 物件,那麼這裡的 Commit 紀錄什麼內容呢?這就是我們接下來要了解的 Commit 物件。
首先我們先看一下 Commit 物件的內容:
$ git cat-file -p [Commit 物件的 40 字元] # 查看物件內容
-t
參數為用來查看檔案的型態,-p
參數則是查看檔案的內容。
得到的提示會有:
tree e07ec1da62dfc5eaf8dee3964c2008eedaac7e35
parent dba939f16134c489b3d5ab198fd32cdc7db45e16
author cycChuyin <draw136also761@gmail.com> 1633096798 +0800
committer cycChuyin <draw136also761@gmail.com> 1633096798 +0800
update
分別紀錄著:
parent
表示指向上一次的 CommitParent 關係決成了 Git 線圖的線如何連接,除了作為起點的 Commit 之外,每個 Commit 都有 Parent,有時還會有兩個以上的 Parent。
因為有 Parent 紀錄前一個 Commit ,所有的 Commit 都可以串連起來,因此可以繼續透過git cat-file
指令找到我們要的檔案或是檔名等等。
從上面結果來看,我們可以整理 Commit 、 Tree 、 Blob 之間的關係。
如果又提交一次 Commit ,則關係變化會是:
👉 整理目前為止的規則:
⚠️ 特別注意:Commit、Tree、Blob 都是除存在 .git/objects 裡面,以 SHA1 當檔名的二進制檔案!
Tag 物件不會在我們執行 Commit 的過程中產出,而是需要透過我們手動把 Tag 貼在某個 Commit 上。
Tag 有分「輕量標籤」與「附註標籤」,這在後續的篇幅會介紹到。
首先讓我們在某個 Commit 上新增附註標籤:
$ git tag -a [Tag名稱] -m"紀錄訊息"
-a
參數為新增附註標籤之意
此時在 Object 目錄裡會看到新增的檔案:
讓我們看看這個檔案的型態跟內容分別是什麼呢?使用 git cat-file 指令搭配參數查看
$ git cat-file -t [SHA-1值] # 型態
$ git cat-file -p [SHA-1值] # 內容
Tag 回饋訊息一樣包含了作者名稱、新增的日期、Tag 標籤名稱,以及當時紀錄的訊息。
但這裡需要注意的是:
⚠️ Tag 物件並不是以 SHA-1 當檔名的二進制檔案,而是紀錄著「Commit」的 SHA-1,並儲存在 .git/refs 裡面。
Tag 標籤不會隨著 Commit 新增而移動,他會固定指向那個 Commit
Git 四種物件的關係與執行指令時的關係:
參考文章:Git 原理入門